{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "## 3.2.自助聚合算法(bagging)\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "决策树集成模型(DecisionTreeClassifier(criterion))\n",
      "模型评分 0.92\n",
      "混淆矩阵:\n",
      " [[ 5  0  1]\n",
      " [ 0  3  0]\n",
      " [ 0  1 15]]\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.naive_bayes import GaussianNB,BernoulliNB\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "# 自定义创建分类数据集(数据框表示)\n",
    "# 参数N代表生成样本数量\n",
    "def getClassficationData(N):\n",
    "    columns = ['x1','x2','x3','y']\n",
    "    df = pd.DataFrame(columns=columns)\n",
    "    for i in range(N):\n",
    "        x1 = np.random.randint(10)\n",
    "        x2 = np.random.randint(20)\n",
    "        x3 = np.random.randint(30)\n",
    "\n",
    "        y = 'normal'\n",
    "        if (x1+x2+x3) > 30:\n",
    "            y='high'\n",
    "        elif (x1+x2+x3) <15:\n",
    "            y='low'\n",
    "        # 添加到数据框\n",
    "        df.loc[i]=[x1,x2,x3,y]\n",
    "    return df\n",
    "\n",
    "# 调用函数,生成100个数据\n",
    "df = getClassficationData(100)\n",
    "X = df[['x1','x2','x3']]\n",
    "Y = df['y']\n",
    "\n",
    "# 现目标变量y是分类变量,需要将其进行数字化编码\n",
    "le = LabelEncoder()\n",
    "y=le.fit_transform(np.ravel(Y))\n",
    "\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)\n",
    "# 使用自助聚合法\n",
    "# criterion表示使用信息熵赌脸\n",
    "dtc = DecisionTreeClassifier(criterion='entropy')\n",
    "bag_model = BaggingClassifier(base_estimator=dtc,n_estimators=100,bootstrap=True,n_jobs=-1)\n",
    "bag_model.fit(X_train,y_train)\n",
    "# 预测新数据,并检查预测的准确率\n",
    "y_test_pred = bag_model.predict(X_test)\n",
    "score = bag_model.score(X_test,y_test)\n",
    "print(\"决策树集成模型(DecisionTreeClassifier(criterion))\")\n",
    "print(\"模型评分\",score)\n",
    "matrix = confusion_matrix(y_test,y_test_pred)\n",
    "print(\"混淆矩阵:\\n\",matrix)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-05T11:32:31.138557500Z",
     "start_time": "2023-09-05T11:32:27.809531500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "基础模型 LogisticRegression()\n",
      "模型评分 0.96\n",
      "混淆矩阵:\n",
      " [[ 5  0  1]\n",
      " [ 0  3  0]\n",
      " [ 0  0 16]]\n",
      "-------------------------------------\n",
      "基础模型 BernoulliNB()\n",
      "模型评分 0.64\n",
      "混淆矩阵:\n",
      " [[ 0  0  6]\n",
      " [ 0  0  3]\n",
      " [ 0  0 16]]\n",
      "-------------------------------------\n",
      "基础模型 GaussianNB()\n",
      "模型评分 0.88\n",
      "混淆矩阵:\n",
      " [[ 5  0  1]\n",
      " [ 0  2  1]\n",
      " [ 0  1 15]]\n",
      "-------------------------------------\n",
      "基础模型 DecisionTreeClassifier(criterion='entropy')\n",
      "模型评分 0.88\n",
      "混淆矩阵:\n",
      " [[ 5  0  1]\n",
      " [ 0  3  0]\n",
      " [ 1  1 14]]\n",
      "-------------------------------------\n"
     ]
    }
   ],
   "source": [
    "# 比较多个不同的基础评估器(弱学习器)\n",
    "lr = LogisticRegression()\n",
    "bnb = BernoulliNB()\n",
    "gnb = GaussianNB()\n",
    "\n",
    "base_methods = [lr,bnb,gnb,dtc]\n",
    "for bm in base_methods:\n",
    "    print(\"基础模型\",bm)\n",
    "    bag_model = BaggingClassifier(base_estimator=bm,n_estimators=100,bootstrap=True,n_jobs=-1)\n",
    "    bag_model.fit(X_train,y_train)\n",
    "    y_test_pred = bag_model.predict(X_test)\n",
    "    score = bag_model.score(X_test,y_test)\n",
    "    print(\"模型评分\",score)\n",
    "    matrix = confusion_matrix(y_test,y_test_pred)\n",
    "    print(\"混淆矩阵:\\n\",matrix)\n",
    "    print('-'*37)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-05T11:32:37.416828300Z",
     "start_time": "2023-09-05T11:32:35.297865400Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 3.2.2.随机森林\n",
    "<p>随机森林与bagging方法的区别有两点:①随机森林只能使用分类回归决策树做弱学习器。②在对某个节点作左右划分时,不是从所有特征中选取最优特征。而是从随机选取的k个特征中,选取最优特征</p>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型评分: 0.76\n",
      "混淆矩阵:\n",
      " [[ 3  0  3]\n",
      " [ 0  1  2]\n",
      " [ 0  1 15]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "rf_model = RandomForestClassifier(criterion='entropy',n_jobs=-1,n_estimators=100)\n",
    "rf_model.fit(X_train,y_train)\n",
    "y_test_pred = rf_model.predict(X_test)\n",
    "score = rf_model.score(X_test,y_test)\n",
    "print(\"模型评分:\",score)\n",
    "c=matrix = confusion_matrix(y_test,y_test_pred)\n",
    "print(\"混淆矩阵:\\n\",matrix)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-05T12:01:51.480082Z",
     "start_time": "2023-09-05T12:01:51.274653500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型评分: 0.76\n",
      "混淆矩阵:\n",
      " [[ 4  0  2]\n",
      " [ 0  1  2]\n",
      " [ 0  2 14]]\n"
     ]
    }
   ],
   "source": [
    "# 使用基尼系数\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "rf_model = RandomForestClassifier()\n",
    "rf_model.fit(X_train,y_train)\n",
    "y_test_pred = rf_model.predict(X_test)\n",
    "score = rf_model.score(X_test,y_test)\n",
    "print(\"模型评分:\",score)\n",
    "c=matrix = confusion_matrix(y_test,y_test_pred)\n",
    "print(\"混淆矩阵:\\n\",matrix)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-05T12:03:28.581684300Z",
     "start_time": "2023-09-05T12:03:28.386690700Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 3.2.3 极端随机树\n",
    "<p>极端随机树是对随机森林算法的一种极端化扩展，他的极端化体现在以下两点:①训练每一个弱学习器的时候,极端随机树选取的是所有样本集.②在对每个节点作左右划分时,不再是随机选择特征子集做划分，而是随机选择一个特征作划分节点</p>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "极端随机树模型精度: 0.76\n",
      "混淆矩阵:\n",
      " [[ 4  0  2]\n",
      " [ 0  1  2]\n",
      " [ 0  2 14]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "extrTree_model = ExtraTreesClassifier(n_estimators=100)\n",
    "extrTree_model.fit(X_train,y_train)\n",
    "y_test_pred = extrTree_model.predict(X_test)\n",
    "score = extrTree_model.score(X_test,y_test)\n",
    "print(\"极端随机树模型精度:\",score)\n",
    "matrix = confusion_matrix(y_test,y_test_pred)\n",
    "print(\"混淆矩阵:\\n\",matrix)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-05T12:11:01.244612200Z",
     "start_time": "2023-09-05T12:11:01.112641500Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 3.3.加速提升算法(Boosting)\n",
    "### 3.3.1自适应提升算法(AdaBoost)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "展示AdaBoost算法中,超参数决策树深度对性能的影响.\n",
      "深度=1,评分=0.8\n",
      "深度=2,评分=0.84545\n",
      "深度=3,评分=0.86667\n",
      "深度=4,评分=0.90909\n",
      "深度=5,评分=0.91818\n",
      "深度=6,评分=0.91818\n",
      "深度=7,评分=0.93333\n",
      "深度=8,评分=0.93333\n",
      "深度=9,评分=0.94848\n",
      "深度=10,评分=0.93939\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 720x432 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.font_manager import FontProperties\n",
    "# 1.生成分类数据\n",
    "X,y = make_classification(n_samples=1000,n_features=20,n_informative=15,n_redundant=5,random_state=6)\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.33,random_state=42)\n",
    "\n",
    "# 2.创建一系列集成模型对象(弱学习器的深度不同)\n",
    "# 定义一个词典models,存放弱分类器名称:弱分类器对象\n",
    "models = dict()\n",
    "# 定义10个深度为0,1,2,3,4...10的决策树分类器\n",
    "for depth in range(1,11):\n",
    "    # 定义弱分类器对象基础模型\n",
    "    base = DecisionTreeClassifier(max_depth=depth)\n",
    "    # 定义AdaBoost集成模型\n",
    "    models[str(depth)] = AdaBoostClassifier(base_estimator=base)\n",
    "\n",
    "#3.构建集成模型\n",
    "print(\"展示AdaBoost算法中,超参数决策树深度对性能的影响.\")\n",
    "scores,depths = list(),list()\n",
    "for name,model in models.items():\n",
    "    clf = model.fit(X_train,y_train)\n",
    "    score = clf.score(X_test,y_test)\n",
    "\n",
    "    scores.append(score)\n",
    "    depths.append(name)\n",
    "    print(f\"深度={name},评分={round(score,5)}\")\n",
    "\n",
    "# 4.绘制性能曲线\n",
    "fig = plt.figure(figsize=(10,6))\n",
    "#fig.canvas.manger.set_window_title(\"AdaBoost算法集成模型\")\n",
    "plt.title(\"AdaBoostClassifier Model\")\n",
    "plt.plot(depths,scores,'o-',color='g')\n",
    "plt.xlabel(depths)\n",
    "plt.ylabel(scores)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-05T12:50:23.662662500Z",
     "start_time": "2023-09-05T12:50:19.731334600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型准确度: 0.918\n",
      "基于测试数据的均方误差(MSE): 5.11482\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import datasets\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import GradientBoostingRegressor\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.inspection import permutation_importance\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 1.导入波士顿房价数据集\n",
    "bhPrice = datasets.load_boston()\n",
    "\n",
    "# 2.将数据集划分为训练集和测试集\n",
    "X_train,X_test,y_train,y_test = train_test_split(bhPrice.data,bhPrice.target,random_state=42,test_size=0.1)\n",
    "\n",
    "# 3.标准化数据集\n",
    "sc = StandardScaler()\n",
    "X_train_std = sc.fit_transform(X_train)\n",
    "X_test_std = sc.transform(X_test)\n",
    "\n",
    "# 4.设置几个梯度提升回归树的参数\n",
    "gbr_params = {\n",
    "    'n_estimators':1000,\n",
    "    \"max_depth\":3,\n",
    "    \"min_samples_split\":5, # min_samples_split表示一个内部节点在划分所需要的最小样本数\n",
    "    'learning_rate':0.01,\n",
    "    'loss':'ls'\n",
    "}\n",
    "\n",
    "# 5.创建梯度提升树的对象,并训练模型\n",
    "gbr = GradientBoostingRegressor(**gbr_params)\n",
    "gbr.fit(X_train_std,y_train)\n",
    "\n",
    "# 6.计算并输出决定系数R^2\n",
    "print(\"模型准确度:\",round(gbr.score(X_test_std,y_test),3))\n",
    "\n",
    "# 7.计算均方误差\n",
    "mse = mean_squared_error(y_test,gbr.predict(X_test_std))\n",
    "print(\"基于测试数据的均方误差(MSE):\",round(mse,5))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-06T06:52:08.501091900Z",
     "start_time": "2023-09-06T06:52:03.804932900Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:214: RuntimeWarning: Glyph 36845 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:214: RuntimeWarning: Glyph 20195 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:214: RuntimeWarning: Glyph 27425 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:214: RuntimeWarning: Glyph 25968 missing from current font.\n",
      "  font.set_text(s, 0.0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:183: RuntimeWarning: Glyph 36845 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:183: RuntimeWarning: Glyph 20195 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:183: RuntimeWarning: Glyph 27425 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n",
      "E:\\myAnaconda\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py:183: RuntimeWarning: Glyph 25968 missing from current font.\n",
      "  font.set_text(s, 0, flags=flags)\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 1152x576 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 8.使用feature_importance_获得特征变量的重要性指标\n",
    "feature_importance = gbr.feature_importances_\n",
    "#print(feature_importance.shape)\n",
    "sorted_idx = np.argsort(feature_importance)\n",
    "#print(sorted_idx)\n",
    "# pos表示位置\n",
    "pos = np.arange(sorted_idx.shape[0])+0.5\n",
    "#print(pos)\n",
    "\n",
    "# 9.输出feature_importance_获得特征变量的重要性指标\n",
    "fig = plt.figure(figsize=(16,8))\n",
    "plt.subplot(1,2,1)\n",
    "plt.barh(pos,feature_importance[sorted_idx],align='center')\n",
    "plt.yticks(pos,np.array(bhPrice.feature_names)[sorted_idx])\n",
    "plt.title(\"the importance of feature\")\n",
    "result = permutation_importance(gbr,X_test_std,y_test,n_repeats=10,random_state=42,n_jobs=2)\n",
    "sorted_idx = result.importances_mean.argsort()\n",
    "# 10 计算不同弱学习器个数对应的评分\n",
    "test_score = np.zeros((gbr_params['n_estimators'],),dtype=np.float64)\n",
    "for i,y_pred in enumerate(gbr.staged_predict(X_test_std)):\n",
    "    test_score[i] = gbr.loss_(y_test,y_pred)\n",
    "\n",
    "# 绘制偏差曲线\n",
    "plt.subplot(1,2,2)\n",
    "plt.title(\"Deviance\")\n",
    "plt.plot(np.arange(gbr_params['n_estimators'])+1,gbr.train_score_,'b-')\n",
    "plt.plot(np.arange(gbr_params['n_estimators'])+1,test_score,'r-')\n",
    "plt.legend()\n",
    "plt.xlabel(\"迭代次数\")\n",
    "\n",
    "fig.tight_layout()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-06T06:52:13.833890100Z",
     "start_time": "2023-09-06T06:52:11.195638200Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "决策树精度 0.75\n",
      "多层感知机精度 0.75\n",
      "K最近邻 0.75\n",
      "投票集成分类 0.769\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.ensemble import VotingClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 0 随机树种子\n",
    "seed =0\n",
    "# 1.导入鸢尾花数据集\n",
    "irisData = load_iris()\n",
    "X0 = irisData.data\n",
    "y0 = irisData.target\n",
    "# 2.本例子中,仅考虑前2个特征变量,以便绘制图形\n",
    "X = X0[:,0:2]\n",
    "y = y0\n",
    "# 3.划分训练集和测试集\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.34,stratify=y,random_state=seed)\n",
    "# 5.定义一个绘制分类评估器决策边界的函数\n",
    "# classifier 训练后的分类器,X,y:输入特征变量和目标变量，title:目标标题\n",
    "def plot_decision_boundary(classifier,X,y,title):\n",
    "    xmin,xmax = np.min(X[:,0])-0.05,np.max(X[:,1])\n",
    "    ymin,ymax = np.min(X[:,1])-0.05,np.max(X[:,1])\n",
    "\n",
    "    step = 0.01\n",
    "    xx,yy = np.meshgrid(np.arange(xmin,xmax,step),np.arange(xmin,xmax,step))\n",
    "    Z = classifier.predict(np.hstack((xx.ravel()[:,np.newaxis],yy.ravel()[:,np.newaxis])))\n",
    "    Z = Z.reshape(xx.shape)\n",
    "\n",
    "    colormap = plt.cm.Paired\n",
    "    plt.contourf(xx,yy,Z,cmap=colormap)\n",
    "    color_map_samples = {0:(0,0,.9),1:(1,0,0),2:(0.8,0.6,0)}\n",
    "    colors = [color_map_samples[c] for c in y]\n",
    "    plt.scatter(X[:,0],X[:,1],c=colors,edgecolors='black')\n",
    "    plt.xlim(xmin,xmax)\n",
    "    plt.ylim(ymin,ymax)\n",
    "    plt.title(title)\n",
    "\n",
    "# 训练一个决策树模型\n",
    "tree = DecisionTreeClassifier(min_samples_split=5,min_samples_leaf=3,random_state=seed)\n",
    "tree.fit(X_train,y_train)\n",
    "print('决策树精度',round(tree.score(X_test,y_test),3))\n",
    "\n",
    "# 训练一个多层感知机模型\n",
    "mlp = MLPClassifier(hidden_layer_sizes=(10,),max_iter=10000,random_state=seed)\n",
    "mlp.fit(X_train,y_train)\n",
    "print(\"多层感知机精度\",round(mlp.score(X_test,y_test),3))\n",
    "\n",
    "# 训练一个KNN\n",
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "knn.fit(X_train,y_train)\n",
    "print(\"K最近邻\",round(knn.score(X_test,y_test),3))\n",
    "\n",
    "# 训练一个投票分类器\n",
    "voting_clf = VotingClassifier(estimators=[(\"Tree\",tree),('MLP',mlp),(\"KNN\",knn)],voting='hard')\n",
    "voting_clf.fit(X_train,y_train)\n",
    "\n",
    "print(\"投票集成分类\",round(voting_clf.score(X_test,y_test),3))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-06T07:54:39.651396300Z",
     "start_time": "2023-09-06T07:54:37.494086900Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "集成精度: 0.974\n"
     ]
    }
   ],
   "source": [
    "X_train,X_test,y_train,y_test = train_test_split(irisData.data,irisData.target,random_state=seed)\n",
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "knn.fit(X_train,y_train)\n",
    "\n",
    "# 训练一个决策树模型\n",
    "tree = DecisionTreeClassifier(min_samples_split=5,min_samples_leaf=3,random_state=seed)\n",
    "tree.fit(X_train,y_train)\n",
    "\n",
    "\n",
    "# 训练一个多层感知机模型\n",
    "mlp = MLPClassifier(hidden_layer_sizes=(10,),max_iter=10000,random_state=seed)\n",
    "mlp.fit(X_train,y_train)\n",
    "\n",
    "voting_clf = VotingClassifier(estimators=[('Tree',tree),('MLP',mlp),(\"Knn\",knn)],voting='hard')\n",
    "voting_clf.fit(X_train,y_train)\n",
    "print(\"集成精度:\",round(voting_clf.score(X_test,y_test),3))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-06T08:01:23.397431100Z",
     "start_time": "2023-09-06T08:01:21.917469400Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5.9 3.  4.2 1.5]\n",
      " [5.8 2.6 4.  1.2]\n",
      " [6.8 3.  5.5 2.1]\n",
      " [4.7 3.2 1.3 0.2]\n",
      " [6.9 3.1 5.1 2.3]]\n",
      "[1 1 2 0 2]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn.ensemble import RandomForestClassifier,StackingClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "# 加载鸢尾花数据集\n",
    "iris = load_iris()\n",
    "X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0)\n",
    "print(X_train[:5])\n",
    "print(y_train[:5])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-07T02:11:32.201820500Z",
     "start_time": "2023-09-07T02:11:15.186546700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "二级堆栈范化精度: 0.9473684210526315\n"
     ]
    }
   ],
   "source": [
    "# 构建第一层 基本评估器\n",
    "rndForest1 = RandomForestClassifier(n_estimators=10,random_state=42)\n",
    "knn1 = KNeighborsClassifier(n_neighbors=5)\n",
    "layer_one_estimators = [\n",
    "    ('rf_1',rndForest1),\n",
    "    ('knn_1',knn1)\n",
    "]\n",
    "\n",
    "# 构建第二层 基本评估器\n",
    "dt2 =DecisionTreeClassifier()\n",
    "rndForest2 = RandomForestClassifier(n_estimators=50,random_state=42)\n",
    "layer_two_estimators = [\n",
    "    ('dt2',dt2),\n",
    "    (\"rf_2\",rndForest2)\n",
    "]\n",
    "\n",
    "# 待嵌入的堆栈泛化模型,即构建第二层堆栈泛化所需要的元评估器\n",
    "layer_two_final = StackingClassifier(estimators=layer_two_estimators,final_estimator=LogisticRegression())\n",
    "\n",
    "# 构建最终的堆栈范化模型\n",
    "flnClf = StackingClassifier(estimators=layer_one_estimators,final_estimator=layer_two_final)\n",
    "# 训练最终的范化模型\n",
    "flnClf.fit(X_train,y_train)\n",
    "\n",
    "# 计算准确率\n",
    "scores =flnClf.score(X_test,y_test)\n",
    "print(\"二级堆栈范化精度:\",scores)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-07T02:34:43.459288400Z",
     "start_time": "2023-09-07T02:34:38.847980700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "精度 0.979\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_wine\n",
    "from sklearn.datasets import load_breast_cancer\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.svm import SVC\n",
    "wine = load_wine()\n",
    "cancer = load_breast_cancer()\n",
    "X_train,X_test,y_train,y_test = train_test_split(cancer.data,cancer.target,random_state=42)\n",
    "# 缩放数据集\n",
    "scaler = MinMaxScaler()\n",
    "X_train_scaled=scaler.fit_transform(X_train)\n",
    "X_test_std = scaler.transform(X_test)\n",
    "# 构建决策树分类器\n",
    "dto3 = DecisionTreeClassifier(max_depth=4)\n",
    "\n",
    "# 构建随机森林\n",
    "rf3 = RandomForestClassifier(n_estimators=50,random_state=42)\n",
    "\n",
    "# 构建支持向量机\n",
    "svc =SVC()\n",
    "\n",
    "# 构建基本评估器\n",
    "layer_estimators = [('dto',dto3),(\"rf3\",rf3),('svc',svc)]\n",
    "\n",
    "stackClf = StackingClassifier(estimators=layer_estimators,final_estimator=LogisticRegression(),n_jobs=-1)\n",
    "stackClf.fit(X_train_scaled,y_train)\n",
    "print(\"精度\",round(stackClf.score(X_test_std,y_test),3))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-07T02:49:58.456564600Z",
     "start_time": "2023-09-07T02:49:57.540568700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
